Crédits : JJ Ying (Unsplash)

La bibliothèque Polyfill détournée, des centaines de milliers de sites touchés

Chaine d'approvisionnement, cas d'école

15

Crédits : JJ Ying (Unsplash)

Abonnez-vous pour tout dévorer et ne rien manquer.

Déjà abonné ? Se connecter

Abonnez-vous

Une société chinoise avait racheté le site Polyfill.io et le service qui y était hébergé, utilisé par de nombreux sites. Son usage a été détourné, allant des contenus pornographiques à la diffusion de malwares. Depuis, plusieurs domaines ont été suspendus et des entreprises comme Cloudflare et Google sont intervenues.

Un polyfill est un morceau de code, souvent écrit en JavaScript, utilisé pour fournir des fonctionnalités récentes à d’anciens navigateurs. Une technique utile depuis longtemps pour s’assurer que les internautes ont tous au moins les fonctions de base, même depuis des appareils anciens. Même si leur usage baisse graduellement, on les trouve encore dans des centaines de milliers de sites.

Le site Polyfill.io était particulièrement connu. Il avait été construit pour être une vaste bibliothèque de polyfills, afin que chaque développeur trouve son bonheur. En février cependant, le nom de domaine et compte GitHub ont été rachetés par l’entreprise chinoise Funnull.

Le créateur du projet, Andrew Brett (employé chez Fastly), recommandait alors de supprimer immédiatement toutes les références à Polyfill.io. Il ajoutait que son usage n’était plus nécessaire, les nouvelles technologies étant rapidement adoptées par tous les navigateurs.

Tout s’enchaine rapidement

Abonnez-vous pour tout dévorer et ne rien manquer.

Déjà abonné ? Se connecter

Abonnez-vous

Commentaires (15)


« Si vous possédez un site web, charger un script implique une incroyable relation de confiance avec ce tiers. Leur faites-vous vraiment confiance ? »


C'est pour ça que je râle à chaque fois que je vois un reCaptcha (ou équivalent) sur une page d'identification. Ça a été le cas pendant très longtemps sur ÉDF par exemple.
Alors j'imagine qu'ils utilisent Subresource Integrity, mais je ne suis pas allé vérifier à chaque fois.
D'une manière générale, il faut maîtriser (limiter) les dépendances des projets web envers les librairies tierces.

C'est un vœu pieux, mais ne pas utiliser un marteau pour écraser une mouche est une bonne habitude.
Vu qu'un projet NodeJS c'est un gloubiboulga de dépendances et de dépendances transitives avec à peu près aucune maîtrise, c'est plus qu'un vœu pieu.

Le SCA a de beaux jours devant lui.
Si limiter les dépendances est généralement une bonne chose, le problème ici est légèrement différent. Les sites vulnérables ne le sont pas parce qu'ils ont un polyfill en dépendance. Ils le sont car ils utilisent le CDN de polyfill, qui s'est mis à fournir du contenu vérolé.

La grosse différence entre les deux ? D'un côté, tant qu'il n'y a pas eu récupération des dépendances depuis le site polyfill aucun soucis (pour schématiser pour les connaisseurs, pas de npm install). La faille peut se propager, mais il faut une action (mise à jour du site).

Pour l'autre, un site, sans rien faire, devient vulnérable du jour au lendemain.

fdorin

Si limiter les dépendances est généralement une bonne chose, le problème ici est légèrement différent. Les sites vulnérables ne le sont pas parce qu'ils ont un polyfill en dépendance. Ils le sont car ils utilisent le CDN de polyfill, qui s'est mis à fournir du contenu vérolé.

La grosse différence entre les deux ? D'un côté, tant qu'il n'y a pas eu récupération des dépendances depuis le site polyfill aucun soucis (pour schématiser pour les connaisseurs, pas de npm install). La faille peut se propager, mais il faut une action (mise à jour du site).

Pour l'autre, un site, sans rien faire, devient vulnérable du jour au lendemain.
Je plussoie ! L'un n'excluant pas l'autre, bien au contraire : la disponibilité de ces libs via des CDN facilite leur large utilisation.

C'est acceptable pour des petits projets à durée de vie très courte, pour de la preuve de concept, mais ça s'arrête là.

Que des .gov ou des grands comptes utilisent ce type de cdn, cela me laisse dubitatif.
"dépendre d'un site tier est un SPOF", épisode 15752
Je me souvient il y a qqes années, le projet android par défaut, juste pour "Hello World" faisait x Mega, car il embarquait toutes les bibliothèques de bases.
Je ne sais pas si ça à changé maintenant mais ce serait une bonne idée de faire attention de charger que ce qu'il faut.

Et réflexe du vieux ex-dev, charger une bibliothèque pour en utiliser 2 fonctions simples à coder, voir dont le code est trouvable, ben j’optai toujours sur la solution dont j'avais la maitrise. Mais ce comportement n'existe que dans de très rares cas à des fin de forte optimisation ou de sécurité aujourd'hui.
Quelle serait la solution ? Télécharger les scripts pour les mettre sur son serveur et monitorer les mise à jour ?
Ou tout coder soi même (ce qui semble vraiment compliqué) ?
Comme indiqué par @Glandos en #1, il existe déjà des mécanismes indiquant qu'on valide un checksum pour la bibliothèque chargée à distance.

Après, dans tous les cas, on est pas censé mettre en prod de "latest", que ce soit des images de container ou des versions d'une bibliothèque. C'est une affreuse perte de maîtrise et un gros risque à s'exposer à des breaking changes quand ce ne sont pas des problèmes de sécu comme ici.

La supervision des mises à jour, ça s'automatise comme un rien. Les gestionnaires le font eux-même et des outils comme Dependabot chez GitHub le gèrent aussi. Et dans le cas des libs importées comme ça depuis l'extérieur, à mes yeux c'est une pratique aux antipodes de la sécurité. À voir aussi si les solutions SAST/SCA les vérifient ou non, j'ai un doute là dessus mais cela serait un minimum.
Modifié le 06/07/2024 à 10h54

Historique des modifications :

Posté le 06/07/2024 à 10h54


Comme indiqué par @Glandos en #1, il existe déjà des mécanismes indiquant qu'on facile un checksum pour la bibliothèque chargée à distance.

Après, dans tous les cas, on est pas censé mettre en prod de "latest", que ce soit des images de container ou des versions d'une bibliothèque. C'est une affreuse perte de maîtrise et un gros risque à s'exposer à des breaking changes quand ce ne sont pas des problèmes de sécu comme ici.

La supervision des mises à jour, ça s'automatise comme un rien. Les gestionnaires le font eux-même et des outils comme Dependabot chez GitHub le gèrent aussi. Et dans le cas des libs importées comme ça depuis l'extérieur, à mes yeux c'est une pratique aux antipodes de la sécurité. À voir aussi si les solutions SAST/SCA les vérifient ou non, j'ai un doute là dessus mais cela serait un minimum.

Ça pourrait parfaitement arriver un jour à jQuery ! ce truc inutile utilisé absolument partout.
J'ai l'impression que les dev web ne savent plus rien faire sans devoir importer 3 tonnes de lib javascript pour faire des pages web de 4 lignes de texte et deux images pour 45MB au total.

Perso, juste avec du CSS et du HTML j'ai pu faire des templates Hugo qui ont des éléments interactifs comme un carrousel, déplier / replier des informations, et afficher des petites pop-up sur un "?".
Le seul élément JS que j'ai fini par mettre, c'était pour intégrer un fil Mastodon depuis le flux RSS de ce dernier.

Tout ceci me semble être la solution de facilité sacrifiant sur cet autel la maîtrise et la sécurité.
Modifié le 07/07/2024 à 10h46

Historique des modifications :

Posté le 07/07/2024 à 10h44


J'ai l'impression que les dev web ne savent plus rien faire sans devoir importer 3 tonnes de lib javascript pour faire des pages web de 4 lignes de texte et deux images qui vont 45Mb.

Perso, juste avec du CSS et du HTML j'ai pu faire des templates Hugo qui ont des éléments interactifs comme un carrousel, déplier / replier des informations, et afficher des petites pop-up sur un "?".
Le seul élément JS que j'ai fini par mettre, c'était pour intégrer un fil Mastodon depuis le flux RSS de ce dernier.

Tout ceci me semble être la solution de facilité sacrifiée sur l'autel de la maîtrise et de la sécurité.

Posté le 07/07/2024 à 10h45


J'ai l'impression que les dev web ne savent plus rien faire sans devoir importer 3 tonnes de lib javascript pour faire des pages web de 4 lignes de texte et deux images qui vont 45Mb.

Perso, juste avec du CSS et du HTML j'ai pu faire des templates Hugo qui ont des éléments interactifs comme un carrousel, déplier / replier des informations, et afficher des petites pop-up sur un "?".
Le seul élément JS que j'ai fini par mettre, c'était pour intégrer un fil Mastodon depuis le flux RSS de ce dernier.

Tout ceci me semble être la solution de facilité sacrifiant sur cet autel la maîtrise et la sécurité.

SebGF

J'ai l'impression que les dev web ne savent plus rien faire sans devoir importer 3 tonnes de lib javascript pour faire des pages web de 4 lignes de texte et deux images pour 45MB au total.

Perso, juste avec du CSS et du HTML j'ai pu faire des templates Hugo qui ont des éléments interactifs comme un carrousel, déplier / replier des informations, et afficher des petites pop-up sur un "?".
Le seul élément JS que j'ai fini par mettre, c'était pour intégrer un fil Mastodon depuis le flux RSS de ce dernier.

Tout ceci me semble être la solution de facilité sacrifiant sur cet autel la maîtrise et la sécurité.
oui avec quelques css (:hover, transition) tu peux faire beaucoup d'effet, pour le JS, tu peux tout faire sans importer des librairies tierces.

SebGF

J'ai l'impression que les dev web ne savent plus rien faire sans devoir importer 3 tonnes de lib javascript pour faire des pages web de 4 lignes de texte et deux images pour 45MB au total.

Perso, juste avec du CSS et du HTML j'ai pu faire des templates Hugo qui ont des éléments interactifs comme un carrousel, déplier / replier des informations, et afficher des petites pop-up sur un "?".
Le seul élément JS que j'ai fini par mettre, c'était pour intégrer un fil Mastodon depuis le flux RSS de ce dernier.

Tout ceci me semble être la solution de facilité sacrifiant sur cet autel la maîtrise et la sécurité.
Carrément d'accord... et sans parler de la lourdeur d'un code quand l'ensemble d'une bibliothèque est chargée pour qq fonctions basiques : ca n'est pas très écoresponsable.

War Machine

Carrément d'accord... et sans parler de la lourdeur d'un code quand l'ensemble d'une bibliothèque est chargée pour qq fonctions basiques : ca n'est pas très écoresponsable.
J'avoue que le Green IT est une notion qui me fait sourire, car une bonne partie de ses éléments ne sont rien d'autre que de la bonne vieille optimisation qu'on a laissée derrière en se disant "pas grave, j'ai 3TB de RAM et 76CPU faut que ça serve". Et au final elle est tout autant ignorée parce que dans la tête de beaucoup, ce n'est que de la "bonne conscience".

Mais ce que j'ai le plus constaté, c'est qu'en réalité l'optim vient plutôt des coûts. Quand ceux-ci ne sont plus invisibles, on prend conscience qu'une bécane overkill pour faire tourner deux pauv' appli ça coûte très cher. Et je ne parle pas que de la facture du CSP :non:
Modifié le 08/07/2024 à 08h15

Historique des modifications :

Posté le 08/07/2024 à 08h14


J'avoue que le Green IT est une notion qui me fait sourire, car une bonne partie de ses éléments ne sont rien d'autre que de la bonne vieille optimisation qu'on a laissée derrière en se disant "pas grave, j'ai 3TB de RAM et 76CPU faut que ça serve". Et au final elle est tout autant ignorée parce que dans la tête de beaucoup, ce n'est que de la "bonne conscience".

Mais ce que j'ai le plus constaté, c'est qu'en réalité l'optim vient plutôt des coûts. Quand ceux-ci ne sont plus invisibles, on prend conscience qu'une bécane overkill pour faire tourner deux pauv' appli ça coûte très cher.

J'ai une politique no-CDN en dev. Et très forte limitation des dépendances (quand on arrive à suivre qui dépend de qui...).

Du coup, mes applis sont moches, semblent vieilles, mais ... elles fonctionnent internet coupé.

Ma dernière découverte (car au boulot nos sites DMZ n'ont par défaut pas le droit d'aller sur internet): Wordpress dépend d'internet, mais ses plugins, c'est pire! Et encore, quand ce n'est pas le presta lui-même qui héberge des scripts chez lui.

Vivement NIS2!
Modifié le 08/07/2024 à 10h09

Historique des modifications :

Posté le 08/07/2024 à 10h07


J'ai une politique no-CDN en dev. Et très forte limitation des dépendances (quand on arrive à suivre qui dépend de qui...).
Du coup, mes applis sont moches, semblent vieilles, mais ... elles fonctionnent internet coupé.

Fermer